package com.docmgmt.mvp.ragflow;

import com.docmgmt.mvp.ragflow.dto.KnowledgeBaseDetailVO;
import com.docmgmt.mvp.ragflow.dto.ParserConfigDTO;
import com.docmgmt.mvp.ragflow.dto.UpdateKnowledgeBaseRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/**
 * 配置 RAGFlow 知识库参数
 * 
 * 使用 SDK 方式（WebClient）调用 RAGFlow API
 * 配置参数：
 * - 最大 Token 数：512
 * - 相似度阈值：0.6
 * - PDF 解析器：DeepDOC
 * - 自动关键词提取：5
 * - 自动问题提取：2
 */
@Slf4j
@Component
public class ConfigureKnowledgeBase implements CommandLineRunner {

    @Autowired(required = false)
    private RAGFlowClient ragflowClient;

    @Override
    public void run(String... args) throws Exception {
        // 仅在启动时执行一次（可通过环境变量控制）
        String configKb = System.getenv("CONFIGURE_KB");
        if (!"true".equals(configKb)) {
            log.debug("跳过知识库配置（设置 CONFIGURE_KB=true 启用）");
            return;
        }

        if (ragflowClient == null) {
            log.warn("RAGFlowClient 未初始化，跳过知识库配置");
            return;
        }

        try {
            configureKnowledgeBase();
        } catch (Exception e) {
            log.error("配置知识库失败", e);
        }
    }

    /**
     * 配置知识库参数
     */
    public void configureKnowledgeBase() {
        String kbId = "64cb2314bbe011f08e7e6ab8e68c840f";
        
        log.info("========================================");
        log.info("开始配置 RAGFlow 知识库参数");
        log.info("知识库 ID: {}", kbId);
        log.info("========================================");

        try {
            // 构建解析器配置
            ParserConfigDTO.RaptorConfigDTO raptorConfig = ParserConfigDTO.RaptorConfigDTO.builder()
                    .useRaptor(false)
                    .threshold(0.6)  // 相似度阈值
                    .maxToken(512)   // 最大 Token 数
                    .maxCluster(64)  // 最大聚类数
                    .build();

            ParserConfigDTO parserConfig = ParserConfigDTO.builder()
                    .chunkTokenNum(512)        // 最大 Token 数
                    .autoKeywords(5)           // 自动关键词提取数量
                    .autoQuestions(2)          // 自动问题提取数量
                    .delimiter("\n")           // 分隔符
                    .layoutRecognize("DeepDOC") // PDF 解析器
                    .raptor(raptorConfig)
                    .build();

            // 构建更新请求
            UpdateKnowledgeBaseRequest updateRequest = UpdateKnowledgeBaseRequest.builder()
                    .name("Company Main KB")
                    .description("企业主知识库 - 用于 AI 问答")
                    .chunkMethod("naive")
                    .parserConfig(parserConfig)
                    .build();

            log.info("配置参数:");
            log.info("  - 最大 Token 数: 512");
            log.info("  - 相似度阈值: 0.6");
            log.info("  - PDF 解析器: DeepDOC");
            log.info("  - 自动关键词提取: 5");
            log.info("  - 自动问题提取: 2");
            log.info("  - 分隔符: \\n");
            log.info("");

            // 调用 SDK 更新知识库
            log.info("调用 RAGFlow SDK 更新知识库配置...");
            KnowledgeBaseDetailVO result = ragflowClient.updateKnowledgeBase(kbId, updateRequest);

            // 验证配置
            log.info("========================================");
            log.info("✅ 知识库配置更新成功！");
            log.info("========================================");
            log.info("知识库详情:");
            log.info("  - ID: {}", result.getId());
            log.info("  - 名称: {}", result.getName());
            log.info("  - 描述: {}", result.getDescription());
            log.info("  - 分块方法: {}", result.getChunkMethod());
            log.info("  - 嵌入模型: {}", result.getEmbeddingModel());
            
            if (result.getParserConfig() != null) {
                log.info("  - 解析器配置:");
                log.info("    - Chunk Token 数: {}", result.getParserConfig().getChunkTokenNum());
                log.info("    - 自动关键词: {}", result.getParserConfig().getAutoKeywords());
                log.info("    - 自动问题: {}", result.getParserConfig().getAutoQuestions());
                log.info("    - 布局识别: {}", result.getParserConfig().getLayoutRecognize());
                log.info("    - 分隔符: {}", result.getParserConfig().getDelimiter());
            }
            
            log.info("  - 文档数: {}", result.getDocumentCount());
            log.info("  - 分块数: {}", result.getChunkCount());
            log.info("  - 创建时间: {}", result.getCreatedAt());
            log.info("========================================");

        } catch (Exception e) {
            log.error("❌ 配置知识库失败: {}", e.getMessage(), e);
            throw e;
        }
    }
}

